package ru.pb.auth.network.engine.auth.packets.sendable;

import ru.pb.auth.dao.AccountsDAO;
import ru.pb.auth.dao.PlayerInfoDAO;
import ru.pb.auth.network.engine.auth.packets.AuthServerToAuthClientPacket;
import ru.pb.global.dao.DAOManager;
import ru.pb.global.data.model.ClanInfo;
import ru.pb.global.data.model.InventoryInfo;
import ru.pb.global.data.model.ItemInfo;
import ru.pb.global.data.model.PlayerInfo;

/**
 * Пакет информации о персонаже
 * 
 * @author: DarkSkeleton, Felixx
 * @version: 1.00
 */
public class PROTOCOL_BASE_GET_MYINFO_ACK extends AuthServerToAuthClientPacket
{
	private AccountsDAO _accauntDao = DAOManager.getDAOImpl(AccountsDAO.class);
	private PlayerInfoDAO _playerDao = DAOManager.getDAOImpl(PlayerInfoDAO.class);

	private static final String hex = "00 00 00 00 00 00 00 00 00 00 06 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF 0F FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 01 01 01 01 02 02 01 01 02 01 01 01 01 01 01 02 02 01 01 01 01 02 01 03 01 00 01 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 39 00 00 00 19 00 00 00 23 00 00 00 01 00 00 00 27 00 00 00 01 00 00 00 28 00 00 00 01 00 00 00 01 00 00 00 2C 00 00 00 00 00 00 00 00 00 00 00 3C 02 FE FF FE BF CF 77 07 02 00 00 8D 01 88 00 89 00 8D 00 8D 00 8D 00 8D 01 09 00 01 00 00 00 8D 00 80 00 88 00 88 00 88 00 00 00 00 00 8C 00 88 00 88 00 88 00 00 00 08 00 00 00 80 00 80 00 00 00 80 00 80 00 80 00 80 00 80 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 00 00 00 00 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 01 00 01 01 01 00 00 00 00 00 00 01 00 00 01 EE DF 03 00 00 00 00 00 00 00 00 00 01 05 00 6E 6F 6E 65 00 00 00 00 00 00 00 00 00 00";
	private PlayerInfo _player_info;
	private ClanInfo _clan_info;
	private InventoryInfo _inventory_info;
	private int _money;

	private static final int UNK = 0;

	public PROTOCOL_BASE_GET_MYINFO_ACK(String account)
	{
		_money = _accauntDao.getMoney(account);
		_player_info = _playerDao.getPlayerInfo(account);
		_clan_info = _player_info.getClanInfo();
		_inventory_info = _player_info.getInventoryInfo();
	}

	@Override
	public void writeImpl()
	{
		writeH(2566);
		writeD(UNK);
		if(UNK >= 0)
		{
			writeC(221); // Хз что это!
			// инфа о персе
			// ===== i3NetworkPacket__ReadData(a2, &v302, 101); =====
			writeS(_player_info.getPlayerName(), 33); // Имя перса
			writeD(_player_info.getExp()); // опыт
			writeD(_player_info.getRank()); // ранк (0-54)
			writeD(1); // Пока не понятно за чего отвечают пустые байты...
			writeD(_player_info.getGamePoint()); // ГП
			writeD(_money); // Рублики

			writeB(new byte[13]); // Хз что это такое

			writeD(_player_info.getPcCafe()); // Какое то извещение....Оо PC_Cafe(0x02 - Премиум, 0x01 - Нормал, 0x00 - нет пс_кафе) =)
			writeH();

			// КланИнфа
			writeS(_clan_info.getClanName(), 16); // Clan name 16 символов =)
			writeC(); // что то типа разделителя между названием клана и его рангом
			writeH(_clan_info.getClanRank()); // Ранг клана - 53 - max

			writeC(_player_info.getClanInfo().getClanLogo().getLogo1()); // Лого1
			writeC(_player_info.getClanInfo().getClanLogo().getLogo2()); // Лого2
			writeC(_player_info.getClanInfo().getClanLogo().getLogo3()); // Лого3
			writeC(_player_info.getClanInfo().getClanLogo().getLogo4()); // Лого4
			writeH(_player_info.getClanInfo().getClanLogo().getLogoColor()); // цвет названия клана.
			writeD(); // Непонятно чо
			writeD(8670);
			writeD(1010000);
			// ===== i3NetworkPacket__ReadData(a2, &v302, 101); =====

			// ===== i3NetworkPacket__ReadData(a2, v113, 80); =====
			// НЕ СЕЗОН
			writeD(_player_info.getFights(false)); // Количество боев
			writeD(_player_info.getWinFights(false)); // Количество побед
			writeD(_player_info.getLostFights(false)); // Количество поражениев
			writeD(); // Непонятно чо
			writeD(_player_info.getKills(false)); // Количество убийств
			writeD(60); // Непонятно чо
			writeD(_player_info.getDeaths(false)); // Количество смертей
			writeD(23); // Непонятно чо
			writeD(182); // Непонятно чо
			writeD(_player_info.getEscapes(false)); // Количество побегов с поля боя
			// ==========================

			// СЕЗОН
			writeD(_player_info.getFights(true)); // Количество боев
			writeD(_player_info.getWinFights(true)); // Количество побед
			writeD(_player_info.getLostFights(true)); // Количество поражений
			writeD(); // Непонятно чо
			writeD(_player_info.getKills(true)); // Количество убийств
			writeD(60); // Непонятно чо
			writeD(_player_info.getDeaths(true)); // Количество смертей
			writeD(23); // Непонятно чо
			writeD(182); // Непонятно чо
			writeD(_player_info.getEscapes(true)); // Количество побегов с поля боя
			// ===== i3NetworkPacket__ReadData(a2, v113, 80); =====

			// ===== i3NetworkPacket__ReadData(a2, &v286, 20); ====
			/*
			 * TODO Соснифать новые данные с оффа
			 * SLOT_PRIM, // Основное
			 * SLOT_SUB, // Пистолеты
			 * SLOT_MELEE, // Ножи
			 * SLOT_THROWING, // Гранаты
			 * SLOT_ITEM, // Специальное
			 * SLOT_CHAR_RED, // Чар красные
			 * SLOT_CHAR_BLUE, // Чар синие
			 * SLOT_CHAR_HEAD, // Чар голова
			 * SLOT_CHAR_ITEM, // Береты
			 * SLOT_DINO, // На оффе нету, отведен под дино скина.
			 * SLOT_CUPPONS; // На оффе нету отведен для купонов.
			 */
			writeD(_inventory_info.getEquippedItemIdByEquipedSlot(5)); // Скин Мужчина стандартный красные.
			writeD(_inventory_info.getEquippedItemIdByEquipedSlot(6)); // Скин Мужчина стандартный синие.
			writeD(_inventory_info.getEquippedItemIdByEquipedSlot(7)); // Шлем.
			writeD(_inventory_info.getEquippedItemIdByEquipedSlot(8)); // Берет.
			writeD(_inventory_info.getEquippedItemIdByEquipedSlot(9)); // Скин дино.
			// ===== i3NetworkPacket__ReadData(a2, &v286, 20); =====

			// ===== i3NetworkPacket__ReadData(a2, &v303, 20); ====
			writeD(_inventory_info.getEquippedItemIdByEquipedSlot(0)); // Основное оружие
			writeD(_inventory_info.getEquippedItemIdByEquipedSlot(1)); // Второстепенное оружие
			writeD(_inventory_info.getEquippedItemIdByEquipedSlot(2)); // Ближнего боя
			writeD(_inventory_info.getEquippedItemIdByEquipedSlot(3)); // Гранаты (Гранаты для взрыва)
			writeD(_inventory_info.getEquippedItemIdByEquipedSlot(4)); // Гранаты (Гранаты специальные, смок, слеповуха)
			// ===== i3NetworkPacket__ReadData(a2, &v303, 20); =====

			// ===== i3NetworkPacket__ReadData(a2, &v279, 40); =====
			writeB(new byte[40]); // Для купонов одетых и/или итемов?
			// ===== i3NetworkPacket__ReadData(a2, &v279, 40); =====

			// === Есть ли инвентарь
			writeC(1);
			// ===== Данные если выше true
			writeD(/* 6 */_inventory_info.getAllArmors().size()); // количество предметов в слоте "Солдат"
			writeD(/* 8 */_inventory_info.getAllWeapons().size()); // количество предметов в слоте "Оружие"
			writeD(/* 3 */_inventory_info.getAllCupons().size()); // количество предметов в слоте "Купоны"
			writeD(/* 0 */_inventory_info.getAllEtcItems().size()); // количество предметов в новом слоте
			writeD(676255); // Чо за херь? Нет в декомпиле.
			writeD(); // Чо за херь? Нет в декомпиле.
			// ===== Данные

			// Солдат
			for(ItemInfo a : _inventory_info.getAllArmors())
			{
				writeD(a.getItemId()); // ID
				writeB(new byte[] {0x03, 0x01, 0x00, 0x00}); // параметры вещи...пока не понятно зачем они нужны...
				writeB(new byte[9]);
			}

			// Оружие
			for(ItemInfo w : _inventory_info.getAllWeapons())
			{
				writeD(w.getItemId()); // ID
				writeB(new byte[] {0x03, 0x01, 0x00, 0x00}); // параметры вещи...пока не понятно зачем они нужны...
				writeB(new byte[9]);
			}

			// купоны
			for(ItemInfo c : _inventory_info.getAllCupons())
			{
				writeD(c.getItemId()); // ID
				writeB(new byte[] {0x03, 0x01, 0x00, 0x00}); // параметры вещи...пока не понятно зачем они нужны...
				writeB(new byte[9]);
			}

			// Новое чото.
			for(ItemInfo e : _inventory_info.getAllEtcItems())
			{
				writeD(e.getItemId()); // ID
				writeB(new byte[4]); // параметры вещи...пока не понятно зачем они нужны...
				writeB(new byte[9]);
			}

			// В этой парашке идет настройки юзера, квесты юзера.. и походу что то ещщо. наверно)
			writeB(fromHex(hex));
			/*
			 * writeC();
			 * writeD();
			 * writeD();
			 * writeD();
			 * writeD();
			 * writeB(new byte[89]);
			 * for(int j = 0; j < 4; ++j)
			 * {
			 * for(int k = 0; k < 10; ++k)
			 * {
			 * for(int l = 0; l < 4; ++l)
			 * {
			 * writeC();
			 * }
			 * }
			 * }
			 * writeB(new byte[8]);
			 * writeB(new byte[3]);
			 * writeB(new byte[4]);
			 * writeB(new byte[52]);
			 * writeC(); // iter1
			 * writeC(); // iter2
			 * int iter2 = 0; // итерация 2 !!!
			 * for(int i = 0; i < iter2; i++)
			 * {
			 * writeD();
			 * }
			 * int iter1 = 0; // итерация 1 !!!
			 * if(iter1 > 0)
			 * {
			 * int size = iter1;
			 * if(iter1 > 60)
			 * size = 60;
			 * for(int i = 0; i < size; i++)
			 * writeH();
			 * if(iter1 > 60)
			 * for(int m = 0; m < iter1 - 60; m++)
			 * writeH();
			 * }
			 * if(iter1 > 0)
			 * {
			 * int size = iter1;
			 * if(iter1 > 60)
			 * size = 60;
			 * writeB(new byte[size]);
			 * if(iter1 > 60)
			 * for(int n = 0; n < iter1 - 60; n++)
			 * writeC();
			 * }
			 * int count = 0;
			 * writeC(count);
			 * for(int i = 0; i < count; i++)
			 * writeD();
			 * writeD();
			 * writeD();
			 * writeC();
			 * int count2 = 0;
			 * writeH(count2);
			 * writeB(new byte[count2]);
			 * writeD();
			 * writeD();
			 * writeC();
			 */
		}
	}
}